export default {
    /**
     * 从事件对象中提取 dataset 数据
     * @param {Object} e - 小程序事件对象
     * @returns {Object} 事件对象中的 dataset 数据
     */
    $getData: (e) => e.currentTarget.dataset,

    /**
     * 创建一个函数，该函数每次调用时从数组中随机返回一个元素，并将其从数组中移除
     * @param {Array} arr - 目标数组
     * @returns {Function} 返回一个函数，每次调用返回数组中的一个随机元素
     */
    $random: (arr) => {
        let randomArr = arr.slice(); // 创建数组的副本以避免修改原数组
        return () => {
            if (randomArr.length === 0) {
                console.warn('目标数组已空');
                return;
            }
            let rIndex = Math.floor(Math.random() * randomArr.length);
            return randomArr.splice(rIndex, 1)[0];
        }
    },

    /**
     * 根据给定的最大长度截取数组，可选地使用 triLength 进行额外判断
     * @param {Array} dataArr - 待截取的数组
     * @param {Number} maxlength - 截取后的最大长度
     * @param {Number} [triLength] - 触发截取的数组长度阈值
     * @returns {Array} 截取后的数组
     */
    $cutArray: (dataArr, maxlength, triLength = maxlength) => {
        if (dataArr.length > triLength) {
            dataArr.splice(maxlength, dataArr.length - maxlength);
        }
        return dataArr;
    },

    /**
     * 将对象转换为URL查询字符串
     * @param {Object} data - 待转换的对象
     * @returns {String} 转换后的查询字符串
     */
    $dataToString: (data) => {
        return Object.entries(data).map(([key, value]) => `${key}=${value}`).join('&');
    },

    /**
     * 截取字符串到指定长度并添加结束符
     * @param {String} str - 原字符串
     * @param {Number} [len=5] - 截取长度
     * @param {String} [end='..'] - 结束符
     * @returns {String} 处理后的字符串
     */
    $shinglier: (str, len = 5, end = '..') => {
        return str.length > len ? str.substring(0, len) + end : str;
    },

    /**
     * 将字符串拆分为指定长度的子字符串数组
     * @param {String} str - 原字符串
     * @param {Number} [len=1] - 子字符串的长度
     * @param {Array} [strArr=[]] - 递归过程中用于累积子字符串的数组
     * @returns {Array} 子字符串数组
     */
    $strSm: (str, len = 1, strArr = []) => {
        while (str.length > 0) {
            strArr.push(str.substr(0, len));
            str = str.slice(len);
        }
        return strArr;
    }
};
